<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8" />
	<title>二阶段机试阅卷程序</title>
</head>

<body>

	<div>
		班级名称：
		<input id="classId" type="text"><br />
		请输入学生姓名（以逗号隔开）：
		<input id="nameId" type="text"
			value="王永乐,张朝,苗欣悦,王博,岳银磊, 陈智辉,李张超,陈鑫瑞,杨景凡,张岩,王西岳,吴勇,任垣宜,蔡万涛,张全忠,辛文涛,王思琪,杨毓萍,田骋东,董毫,于露,尹艺蓉,杨佳迪,马旭东,屈千禧,杨润,王彬冰,刘涛,谷亚婕,张露茜,曹文凯,王帅,贺资森,郑浩,李登阳,贺亦盼,秦敏蕙,张彤,张雪梅,席向钊,李虎成,贺明霞,刘博文,李鑫,张成,李生岳,赵育航,黄鑫,尉伟伟,允丽,李书旺" /><br />
		<input id="btn" type="button" value="进行阅卷" />
		阅卷结果：<br>
		<table id="t" border="1">
			<tr>
				<td>序号</td>
				<td>姓名</td>
				<td>找数find</td>
				<td>加密程序conver</td>
				<td>千位分toMoneyStr</td>
				<td>数组的扁平化flattenArray</td>
				<td>深拷贝copyObj</td>
				<td>合计</td>
			</tr>
		</table>
	</div>
</body>

</html>
<script type="text/javascript" src="./js/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
	/*
	要求：
	提交答卷时，每个人以自己的名字作为文件夹名，下面有js字目录，js子目录下是tools.js文件
	
	如：张三的答卷目录为：  张三\01第一题封装函数\js\tools.js
	
	*/

	//var names=['孙瑜琴', '陈晓艳',  '王智涛', '郭倩', '肖雨',  '韦苗苗', '高青君', '梁俏霞', '王敬', '闫力青', '董锦锦', '王军', '连钰辉', '杜成峰', '王静', '李春燕', '马佳瑞', '张楚楚', '张东', '杨清奇', '左倩倩', '邢涛', '仲家伟', '陈建渊', '潘雅荣', '张永帅', '董亚婷', '王晓丽', '梁志科', '赵文涛', '苏佳丽', '韦初金', '鲍佳敏', '张志颖', '白晨妍', '李小强', '王聪2', '王港', '王旭琛', '韩悦', '杨凌', '吕欢欢', '梅俊', '王一棋', '荆学亮', '郭晨', '张航源', '惠杰', '田士兴', '李鹏飞', '梁犇', '高荣荣', '赵含', '冯磊', '李庚', '张尧', '路鹏', '孙宇飞', '王聪1', '薛旺旺', '顾强', '张家豪', '闫美艳', '陈昭', '田宁', ' 潘斌', '刘方利', '李小莉', '陈德林', '朱东升', '白国帅', '薛霞飞', '张裕琥', '李姣姣', '朱旭洋', '韩雨萌', '刘超', '于佳一', '王娟', '拓田',"邢涛"];

	// 成绩数组
	var scoreJsons = [];
	// 答卷基础文件夹
	var basePath = "/01第一题封装函数/js/tools.js"

	function getScore() {
		let nameStr = $("#nameId").val();
		// let names = nameStr.split(",");
		let names = ["王帅","陆仪田","曹冲","王永乐", "张朝", "苗欣悦", "王博", "岳银磊", "陈智辉", "李张超", "陈鑫瑞", "杨景凡", "张岩", "王西岳", "吴勇", "任垣宜", "蔡万涛", "张全忠", "辛文涛", "王思琪", "杨毓萍", "田骋东", "董毫", "于露", "尹艺蓉", "杨佳迪", "马旭东", "屈千禧", "杨润", "王彬冰", "刘涛", "谷亚婕", "张露茜", "曹文凯", "王帅", "贺资森", "郑浩", "李登阳", "贺亦盼", "秦敏蕙", "张彤", "张雪梅", "席向钊", "李虎成", "贺明霞", "刘博文", "李鑫", "张成", "李生岳", "赵育航", "黄鑫", "尉伟伟", "允丽", "李书旺"];
		names.sort();
		console.log("names.length",names.length);
		let count = 0;
		for (let i in names) {
			console.log("以下是：" + names[i]);
			let path = "答卷/" + names[i] + basePath;

			$.ajax({
				url: path,
				dataType: "script",
				success() {
					calcScore(names[i],i);
				},
				error(err) {
					console.log(names[i] + "的文件或者路径有问题：", err);
				}
			})
			count++;
		}

		let myTimer = setInterval(function () {
			if (count == names.length) {//如果把所有人的成绩都计算过了
				window.clearInterval(myTimer);
				showResult();
			}
		}, 100);
	}

	// 计算成绩
	function calcScore(name,index) {
		let obj = {
			name: name,
			find: first,
			convert: second,
			toMoneyStr: third,
			flattenArray: four,
			copyObj: five
		}
		for(let key in obj){
			if(typeof obj[key]=="function"){
				try {
					obj[key] = obj[key](name);
				} catch (error) {
					console.log(name + "封装的函数有问题", error);
					obj[key] = 0;
				}
			}			
		}
		scoreJsons.push(obj);
	}


	// 1、找数：找出数组中和指定数m相差n的数字。存放到新的数组里（10分）
	//    函数名：find
	//    参数：
	//         数组：
	//         指定数
	//         相差的数
	//    返回值：数组  
	// 如：
	// find([5,6,7,8,9,10,5],7,2);//结果是：[5,9,5]

	function first(name) {

		let score = 0;
		//第一种情况：
		let arr = find([5, 6, 7, 8, 9, 10], 7, 2);
		if (compareObj(arr, [5, 9])) {
			score += 3;
		}

		//第二种情况
		arr = find([5, 6, 7, 8, 9, 10, 5], 7, 2);
		if (compareObj(arr, [5, 9, 5])) {
			score += 3;
		}

		// 第三种情况
		arr = find([5, 6, 7, 5, 8, 9, 10, 9], 7, 2);
		if (compareObj(arr, [5, 5, 9, 9])) {
			score += 4;
		}

		return score;
	}




	// 2、尝试编写一个加密程序，加密方法将明文的字母变成其后的第四个字母，字母表首尾相连，非字母符号不加密。
	// 例如：输入“China”，输出密文“Glmre” （10分）
	//    函数名：encrypt
	//    参数：字符串
	//    返回值：加密后的字符串
	function second(name) {
		/*
		//    函数名：encrypt
		//    参数：字符串
		//    返回值：加密后的字符串
		10分，
		*/

		let score = 0;
		//第一种情况：
		let str = convert("China");
		if (str == "gLMRE") {
			score += 3;
		}

		//第二种情况
		str = convert("ChinZ");
		if (str == "gLMRd") {
			score += 3;
		}

		// 第三种情况
		str = convert("Chin}");
		if (str == "gLMR}") {
			score += 4;
		}

		return score;
	}


	// 3、金额转换：输入不定长度的金额字符串，千位分割符实现。并把数字转成大写的汉字金额
	// 如：1234567=> 壹,贰叁肆,伍陆柒 （10分）
	//    函数名：toMoneyStr
	//    参数：不定长度的金额字符串
	//    返回值：千位分割后的字符串。

	function third(name) {

		let score = 0;
		//第一种情况：
		let str = toMoneyStr("1234567");
		if (str == "壹,贰叁肆,伍陆柒") {
			score += 3;
		}

		//第二种情况
		str = toMoneyStr("567");
		if (str == "伍陆柒") {
			score += 3;
		}

		//第三种情况
		str = toMoneyStr("8751234567");
		if (str == "捌,柒伍壹,贰叁肆,伍陆柒") {
			score += 4;
		}
		return score;
	}


	// 4、实现数组的扁平化（10分）
	// 函数名 flattenArray 
	// 参数：数组
	// 返回值：扁平化后的数组

	function four(name) {
		let score = 0;
		//第一种情况：
		let soureArr = [12, 23, 34];
		let resultArr = flattenArray(soureArr);
		if (compareObj(resultArr, [12, 23, 34])) {
			score += 3;
		}

		//第二种情况
		soureArr = [12, 23, [5, 6], 34, [7]];
		resultArr = flattenArray(soureArr);
		if (compareObj(soureArr, [12, 23, 5, 6, 34, 7])) {
			score += 3;
		}

		//第三种情况
		soureArr = [[0], 1, [2, [3, [4, [5, [6]]]]], [7, [8]]];
		resultArr = flattenArray(soureArr);
		if (compareObj(soureArr, [0, 1, 2, 3, 4, 5, 6, 7, 8])) {
			score += 4;
		}

		return score;
	}

	// 5、深拷贝：实现复制json对象的函数，保证传入和json对象和返回的json对象不共享内存（10分）
	// 如果考虑到json对象的某个属性也是json对象的情况，加5分。
	// 注意：(不要使用json.stringfy()和json.parse())

	function five(name) {

		let score = 0;
		//第一种情况：
		let sourceObj = {
			name: "张三疯",
			sex: "男"
		};

		let obj = copyObj(sourceObj);

		if (obj != sourceObj && compareObj(obj, sourceObj)) {
			score += 10;
		}

		//第二种情况
		sourceObj = {
			name: "张三疯",
			sex: "男",
			wife: {
				name: "梅超风",
				sex: "女",
				age: 12
			}
		};

		obj = copyObj(sourceObj);

		if (obj != sourceObj && compareObj(obj, sourceObj)) {
			score += 5;
		}

		return score;
	}


	// 比较两个对象是否相等
	function compareObj(obj1, obj2) {
		// 1、两个对象的属性数量如果不一样，那么就肯定不相等
		if (Object.keys(obj1).length != Object.keys(obj2).length) {
			return false;
		}
		// 2、两个对象的属性数量一样
		for (let key in obj1) {
			if (typeof obj1[key] == "object") {
				if (typeof obj2[key] == "object") {
					// 两个属性都是对象。
					if (!this.compareObj(obj1[key], obj2[key])) {
						return false;
					}
				} else {
					// obj1是对象，obj2不是对象
					return false;
				}
			} else {
				if (typeof obj2[key] == "object") {
					// obj1不是对象，obj2是对象
					return false;
				} else {
					if (obj1[key] != obj2[key]) {
						return false;
					}
				}
			}
		}
		return true;
	}

	function showResult() {
		for (let i in scoreJsons) {
			let totalScore = 0;
			let htmlStr = "<tr>";
				htmlStr += `<td>${parseInt(i)+1}</td>`;
			for (let key in scoreJsons[i]) {
				htmlStr += `<td>${scoreJsons[i][key]}</td>`;
				if (key != "name") {
					totalScore += parseInt(scoreJsons[i][key]);
				}
			}
			htmlStr += `<td>${totalScore}</td>`;
			htmlStr += "</tr>";

			jQuery("tbody").append(htmlStr);
		}

	}

	window.onload = function () {
		$("#btn")[0].onclick = function () {
			getScore();
		}
	}
//var names=['孙瑜琴', '陈晓艳', '廖培兰', '王智涛', '郭倩', '肖雨', '陈思阳', '韦苗苗', '高青君', '梁俏霞', '王敬', '闫立青', '董锦锦', '王军', '连玉辉', '杜成峰', '王静', '李春燕', '马佳瑞', '张楚楚', '张东', '杨青奇', '左倩倩', '刑涛', '周家伟', '陈建渊', '潘雅蓉', '张永帅', '董亚婷', '王晓丽', '梁志科', '赵文涛', '苏佳丽', '韦初金', '鲍佳敏', '张志颖', '白晨妍', '李小强', '王聪2', '王港', '王旭琛', '韩悦', '杨凌', '吕欢欢', '梅俊', '王一棋', '荆学亮', '郭晨', '张航源', '惠杰', '田士兴', '李鹏飞', '梁犇', '高蓉蓉', '赵含', '冯磊', '李庚', '张尧', '路鹏', '孙宇飞', '王聪1', '薛旺旺', '顾强', '张家豪', '闫美艳', '陈昭', '田宁', ' 潘斌', '刘方利', '李小莉', '陈德林', '朱东升', '白国帅', '薛霞飞', '张裕琥', '李姣姣', '朱旭洋', '韩雨萌', '刘超', '于佳一', '王娟', '拓田'];

</script>